﻿/*****************************************************************//**
 * @file    GraphProviderBase.h
 * @brief   三维可视化数据管理基类。
 *  
 * @author  ChengHaotian (yeguangbaozi@foxmail.com)
 * @date    2024-06-12
 *********************************************************************/

#ifndef __GRAPHPROVIDERBASE_H__
#define __GRAPHPROVIDERBASE_H__

#include <QObject>

#include "GraphDataProviderAPI.h"

#include <QHash>

// 前置声明
namespace Core
{
    class FITKAbstractDataObject;
}

namespace Comp
{
    class FITKGraph3DWindowVTK;
}

namespace Exchange
{
    class FITKAcousticsVTKGraphObject3D;
}

namespace Interface
{
    class FITKGeoCommandList;
}

namespace AbaqusData
{
    class FITKAbaqusPartManager;
}

namespace Acoustics
{
    class FITKAcousticsDiscModel;
    class FITKAcousticsSEAModel;
    class FITKAcousticsFEModel;
    class FITKAcousticsSEASubSysManager;
    class FITKJunctionManager;
    class FITKAcousticsPhysics;
    class FITKAcousticsLoadManager;
}

namespace GraphData
{
    /**
     * @brief   三维可视化数据分类管理类。
     * @author  ChengHaotian (yeguangbaozi@foxmail.com)
     * @date    2024-06-12
     */
    class GRAPHDATAPROVIDERAPI GraphProviderBase : public QObject
    {
        Q_OBJECT

        // 友元，防止外部手动创建或析构。
        friend class GraphProviderManager;

    public:
        /**
         * @brief   获取当前数据管理器的可视化窗口。
         * @return  可视化窗口
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-19
         */
        Comp::FITKGraph3DWindowVTK* getGraphWidget();

        /**
         * @brief   获取当前算例已实例化的可视化对象。[纯虚函数]
         * @return  可视化对象列表。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        virtual QList<Exchange::FITKAcousticsVTKGraphObject3D*> getCurrentGraphObjs() = 0;

        /**
         * @brief   获取当前算例已实例化的当前可见可视化对象。
         * @return  可视化对象列表。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        QList<Exchange::FITKAcousticsVTKGraphObject3D*> getCurrentVisibleGraphObjs();

        /**
         * @brief   获取当前算例已实例化的相机敏感可视化对象。（外部进行局部刷新）[纯虚函数]
         * @return  可视化对象列表。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-06
         */
        virtual QList<Exchange::FITKAcousticsVTKGraphObject3D*> getCurrentCameraSenGraphObjs() = 0;

        /**
         * @brief   获取当前算例已实例化的可见相机敏感可视化对象。（外部进行局部刷新）
         * @return  可视化对象列表。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-06
         */
        QList<Exchange::FITKAcousticsVTKGraphObject3D*> getCurrentVisibleCameraSenGraphObjs();

        /**
         * @brief   获取类名。[虚函数]
         * @return  类名
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        virtual QString getClassName();

        /**
         * @brief   根据数据ID更新可视化对象，没有则跳出。[虚函数]
         * @param   dataId：数据ID
         * @param   forceUpdate：强制刷新[缺省]
         * @return  是否存在该数据ID所对应可视化对象。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        virtual bool updateObjById(int dataId, bool forceUpdate = false);

        /**
         * @brief   更新全部当前可见可视化对象显示状态。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        void updateVisibility();

        /**
         * @brief   清除全部管理中的可视化对象高亮与高级高亮效果。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-07-30
         */
        void clearHighlight();

        /**
         * @brief   设置是否激活双击可拾取对象的拾取状态。[虚函数]
         * @param   pickable：是否可拾取
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-13
         */
        virtual void setDoubleClickPickable(bool pickable);

    protected:
        /**
         * @brief   构造函数。
         * @param   graphWidget：可视化窗口
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        GraphProviderBase(Comp::FITKGraph3DWindowVTK* graphWidget);

        /**
         * @brief   析构函数。[虚函数]
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        virtual ~GraphProviderBase();

        /**
         * @brief   移除数据管理字典中的所有可视化对象数据并析构。
         * @param   hash：数据字典
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        void deleteObjsHash(QHash<int, Exchange::FITKAcousticsVTKGraphObject3D*>& hash);

        /**
         * @brief   移除数据管理字典中的所有可视化对象数据并析构。
         * @param   hash：数据字典
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        void deleteObjsHash(QHash<int, QHash<int, Exchange::FITKAcousticsVTKGraphObject3D*>>& hash);

        /**
         * @brief   通过数据对象、适配器关键字与需要保存到的字典生成或获取可视化对象。
         * @param   adaptorKeyName：适配器关键字
         * @param   objDict：可视化对象字典[引用]
         * @param   dataObj：数据对象
         * @return  可视化对象
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-07-24
         */
        Exchange::FITKAcousticsVTKGraphObject3D* getGraphObject(QString adaptorKeyName, QHash<int, Exchange::FITKAcousticsVTKGraphObject3D*>& objDict, Core::FITKAbstractDataObject* dataObj);
        /**
         * @brief    通过适配器关键字、类名称获取可视化对象
         * @param[i] adaptorKeyName                                    适配器关键字
         * @param[i] className                                         类名称
         * @return   Exchange::FITKAcousticsVTKGraphObject3D*          可视化对象
         * @author   BaGuijun (baguijun@163.com)
         * @date     2025-02-20
         */
        Exchange::FITKAcousticsVTKGraphObject3D* getGraphObject(QString adaptorKeyName, QString className);
        /**
         * @brief   通过数据对象、适配器关键字与需要保存到的字典生成或获取可视化对象。
         * @param   adaptorKeyName：适配器关键字
         * @param   objDict：可视化对象字典[引用]
         * @param   dataObj：数据对象
         * @param   hashKey：存储可视化对象的键
         * @return  可视化对象
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-18
         */
        Exchange::FITKAcousticsVTKGraphObject3D* getGraphObjectByKey(QString adaptorKeyName, QHash<int, Exchange::FITKAcousticsVTKGraphObject3D*>& objDict,
            Core::FITKAbstractDataObject* dataObj, int hashKey);

    signals:
        /**
         * @brief   信号 - 需要被手动析构。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-19
         */
        void sig_needToDelete();

    protected:
        /**
         * @brief   管理器所管理的可视化窗口。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        Comp::FITKGraph3DWindowVTK* m_graphWidget{ nullptr };

        /**
         * @brief   几何命令管理器。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-29
         */
        Interface::FITKGeoCommandList* m_geoCmdList{ nullptr };

        /**
         * @brief   声学模型数据。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-29
         */
        Acoustics::FITKAcousticsDiscModel* m_discModel{ nullptr };

        /**
         * @brief   SEA模型数据。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        Acoustics::FITKAcousticsSEAModel* m_seaModel{ nullptr };

        /**
         * @brief   FE模型数据。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-14
         */
        Acoustics::FITKAcousticsFEModel* m_feModel{ nullptr };

        /**
         * @brief   网格部件管理器。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-10-29
         */
        AbaqusData::FITKAbaqusPartManager* m_partMgr{ nullptr };

        /**
         * @brief   SEA子系统管理器。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-04
         */
        Acoustics::FITKAcousticsSEASubSysManager* m_seaSubSysMgr{ nullptr };

        /**
         * @brief   SEA连接关系管理器。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-13
         */
        Acoustics::FITKJunctionManager* m_juncMgr{ nullptr };

        /**
         * @brief   物理数据对象。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-11-26
         */
        Acoustics::FITKAcousticsPhysics* m_phyData{ nullptr };
        /**
         * @brief  载荷管理器
         * @author BaGuijun (baguijun@163.com)
         * @date   2024-12-05
         */
        Acoustics::FITKAcousticsLoadManager* m_loadManager = nullptr;
        /**
         * @brief   临时预览可视化对象数据字典。
         * @author  ChengHaotian (yeguangbaozi@foxmail.com)
         * @date    2024-06-12
         */
        QHash<int, Exchange::FITKAcousticsVTKGraphObject3D*> m_previewObjHash = {};

    };
}   // namespace GraphData

#endif // __GRAPHPROVIDERBASE_H__
